package com.hzw.saas.service.hpc.mapper;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hzw.saas.api.hpc.bo.HpcAccountInfoFullBo;
import com.hzw.saas.api.hpc.bo.HpcAccountRecordBo;
import com.hzw.saas.api.hpc.bo.HpcAccountUserBo;
import com.hzw.saas.api.hpc.enums.HpcAccountStatus;
import com.hzw.saas.api.hpc.enums.HpcProviderType;
import com.hzw.saas.api.user.bo.CustomerBO;
import com.hzw.saas.service.hpc.model.HpcAccountUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 用户超算中心帐号表 Mapper 接口
 * </p>
 *
 * @author zzl
 * @since 2021-02-03
 */
@Mapper
public interface HpcAccountUserMapper extends BaseMapper<HpcAccountUser> {

    /**
     * 通过用户ID获取可用的账号列表
     * @param page
     * @param userId
     * @param now
     * @param isMain
     * @param isExpire
     * @return
     */
    IPage<HpcAccountUserBo> getUsableListByPageAndExpireTime(Page page, @Param("userId") String userId, @Param("now") DateTime now, @Param("isMain") Integer isMain, @Param("isExpire") Boolean isExpire);

    /**
     *
     * 通过HPC-USER-ID获取可用的账号列表
     * @param hpcAccountUserIds
     * @param date
     * @return
     */
    List<HpcAccountUserBo> getUsableHpcAccountUserList(@Param("hpcUserIds") List<String> hpcAccountUserIds, @Param("now") Date date);

    /**
     * 通过条件查询已分配的HPC用户列表
     * @param page
     * @param keyword
     * @param levelIds
     * @param status
     * @param hpcProviderType
     * @return
     */
    IPage<HpcAccountInfoFullBo> pageAllotHpcAccountInfoFull(@Param("page") Page page,
                                                            @Param("keyword") String keyword,
                                                            @Param("levelIds") List<String> levelIds,
                                                            @Param("status") HpcAccountStatus status,
                                                            @Param("contractBound") Boolean contractBound,
                                                            @Param("slurmAccounts") List<String> slurmAccounts,
                                                            @Param("expireSort") Boolean expireSort,
                                                            @Param("createSort") Boolean createSort,
                                                            @Param("hpcType") HpcProviderType hpcProviderType);

    /**
     * 查询未分配的HPC列表
     *
     * @param page
     * @param keyWord
     * @param lacked
     * @return
     */
    IPage<HpcAccountInfoFullBo> pageNotAllotHpcAccountInfoFull(Page page,
                                                               @Param("keyword") String keyWord,
                                                               @Param("lacked") Double lacked,
                                                               @Param("hpcType") HpcProviderType hpcProviderType);

    /**
     * 查询账户下所有共享给自己的HPC账号的用户列表（user_id、customer_level）
     * @param userId
     * @return
     */
    List<CustomerBO> listMainSharedCustomers(@Param("userId") String userId);

    /**
     * 获取无效/有效的HPC账号
     *
     * @param hpcAccountUserId
     * @return
     */
    HpcAccountRecordBo getHistoryHpcAccountRecordByHpcUserAccountId(@Param("hpcAccountUserId") String hpcAccountUserId);

    /**
     * 获取HPC账号冻结数量
     * @param hpcProviderType HPC账号类型
     * @param hpcAccountStatus 冻结
     * @return
     */
    int countByHpcType(@Param("type") HpcProviderType hpcProviderType, @Param("status") HpcAccountStatus hpcAccountStatus);
}
